package com.doctcloud.datacloud.service;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.doctcloud.datacloud.entity.OrdersCostsEntity;
import com.doctcloud.datacloud.mapper.OrdersCostsEntityMapper;
import com.doctcloud.hisinfo.api.RemoteHisOrdadmService;
import com.doctcloud.hisinfo.histable.domain.ordadm.OrdersCostsDo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@RequiredArgsConstructor
public class OrdersCostsEntityService extends ServiceImpl<OrdersCostsEntityMapper, OrdersCostsEntity> {

    @Value("${sync.batch.size:500}")
    private int BATCH_SIZE;

    private final RemoteHisOrdadmService remoteHisOrdadmService;

    /**
     * 同步指定患者、指定住院记录的医嘱计价信息。
     *
     * @param patientId 患者ID
     * @param visitId   住院标识
     */
    @Transactional
    public void syncPat(String patientId, Integer visitId) {
        log.info("--- 开始同步患者ID [{}], 住院标识 [{}] 的医嘱计价数据 ---", patientId, visitId);
        long startTime = System.currentTimeMillis();

        try {
            // 1. 从远程服务获取数据
            List<OrdersCostsDo> remoteOrdersCosts = remoteHisOrdadmService.getOrdersCostsById(patientId, visitId);
            if (CollectionUtils.isEmpty(remoteOrdersCosts)) {
                log.warn("从远程服务获取患者ID [{}], 住院标识 [{}] 的医嘱计价信息为空，同步任务终止。", patientId, visitId);
                return;
            }
            log.info("从远程服务获取到 {} 条医嘱计价信息。", remoteOrdersCosts.size());

            // 2. 数据转换与过滤
            List<OrdersCostsEntity> entitiesToUpsert = remoteOrdersCosts.stream()
                    .filter(this::isValidOrderCost)
                    .map(this::convertToEntity)
                    .collect(Collectors.toList());

            if (CollectionUtils.isEmpty(entitiesToUpsert)) {
                log.info("患者ID [{}], 住院标识 [{}] 没有需要同步的有效医嘱计价记录。", patientId, visitId);
                return;
            }
            log.info("准备执行批量UPSERT操作，共 {} 条记录。", entitiesToUpsert.size());

            // 3. 执行批量UPSERT操作
            // 注意：这里假设你的 baseMapper.batchUpsert 方法内部已经实现了分批处理。
            // 如果没有，你可能需要手动循环分批调用，或者使用 this.saveBatch(entitiesToUpsert, BATCH_SIZE)
            int affectedRows = baseMapper.batchUpsert(entitiesToUpsert);

            log.info("--- 同步完成。患者ID [{}], 住院标识 [{}]。总耗时：{} ms。数据库受影响的行数: {} ---",
                    patientId, visitId, System.currentTimeMillis() - startTime, affectedRows);

        } catch (Exception e) {
            log.error("同步患者ID [{}], 住院标识 [{}] 的医嘱计价信息时发生异常: ", patientId, visitId, e);
            // 抛出异常以触发事务回滚，并通知调用方
            throw e;
        }
    }

    /**
     * 校验 OrdersCostsDo 对象是否有效。
     *
     * @param doObj 待校验的 OrdersCostsDo 对象
     * @return 如果有效返回 true，否则返回 false
     */
    private boolean isValidOrderCost(OrdersCostsDo doObj) {
        return doObj != null &&
                doObj.getPatientId() != null && !doObj.getPatientId().trim().isEmpty() &&
                doObj.getVisitId() != null &&
                doObj.getItemClass() != null && !doObj.getItemClass().trim().isEmpty() &&
                doObj.getItemCode() != null && !doObj.getItemCode().trim().isEmpty() &&
                doObj.getItemSpec() != null && !doObj.getItemSpec().trim().isEmpty() &&
                doObj.getAmount() != null;
    }

    /**
     * 将 OrdersCostsDo 转换为 OrdersCostsEntity。
     * 使用 BeanUtils.copyProperties 简化属性拷贝。
     *
     * @param doObj 源对象 OrdersCostsDo
     * @return 转换后的目标对象 OrdersCostsEntity
     */
    private OrdersCostsEntity convertToEntity(OrdersCostsDo doObj) {
        OrdersCostsEntity entity = new OrdersCostsEntity();
        BeanUtils.copyProperties(doObj, entity);
        // 如有特殊字段需要手动处理，可以在此处添加
        // 例如：entity.setSyncTime(LocalDateTime.now());
        return entity;
    }
}